package cc.idoone.spring_boot_hello.proxy.aop;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

/**
 * Java 动态代理测试
 *
 * @auther hemj
 * @since 2017/10/2
 */
public class MyInvocationHandler implements InvocationHandler {
	//要代理的真实对象
	private Object subject;

	public MyInvocationHandler(Object subject) {
		this.subject = subject;
	}

	// 当代理的方法被调用时，代理会把这个调用转发给InvocationHandler。
	// 不管代理被调用的事何种方法，处理器被调用的一定是invoke方法。
	@Override
	public Object invoke(Object arg0, Method arg1, Object[] arg2) throws Throwable {
		// 在调用真实对象方法前我们可以添加一些自己的操作
		System.out.println("before invoke real method");
		System.out.println("proxy instance: " + arg0.getClass().getName());
		System.out.println("method: " + arg1);
		System.out.println("arguments: " + arg2);

		// 通过Method类调用真实对象的方法
		Object result = arg1.invoke(subject, arg2);

		// 在调用真实对象方法后我们也可以添加一些自己的操作
		System.out.println("after invoke real method");

		return result;
	}
}
